package dbzx.pdf;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

import javax.swing.JComboBox.KeySelectionManager;

import org.json.JSONArray;
import org.json.JSONObject;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfReprot {
	/** windows字体路径 */
	public static final String FONT = "C:/WINDOWS/Fonts/simhei.ttf";
//	public static final String FONT = "C:/WINDOWS/Fonts/simsun.ttc,0";
	/** 保存文件夹的路径 */
	public static final String BASE_DEST = "E:/项目资料/pdfCreat/";
	
	/** 封面一级标题 */
	public static Font firstCoverFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,40,Font.NORMAL,BaseColor.BLACK);
	/** 封面二级标题 */
	public static Font secondCoverFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,14,Font.NORMAL,BaseColor.BLACK);
	/** 目录标题 */
	public static Font contentsTitleFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,12,Font.NORMAL,BaseColor.BLACK);
	/** 正文标题 */
	public static Font firstTitleFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,25,Font.BOLD,new BaseColor(117,143,199));
	/** 正文 */
	public static Font textFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,10,Font.NORMAL,BaseColor.BLACK);
	/** 表格表头字体 */
	public static Font tableHeadFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,10,Font.BOLD,BaseColor.BLACK);
	/** 无数据的字体 */
	public static Font emptyFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,10,Font.ITALIC,BaseColor.BLACK);
	
	/** 存放中英文字段的对照map的集合  */
	public java.util.List<LinkedHashMap<String, String>> dataList = new ArrayList<LinkedHashMap<String,String>>();
	/** 存放json中对应每个标题数据的key名称 */
	public String[] titlejsonName = { "basicList","shareHolderList","personList","frPositionList",
			"entinvItemList","sharesImpawnList","sharesFrostList","alterList",
			"caseInfoList","filiationList","finalshareholdList","dealinInfoList",
			"liquidationList","morDetaiList","morguaInfoList",
	};
	/** 存放每个标题的中文名称 */
	public String[] titleCnName = {"企业照面信息","企业股东及出资信息","企业主要管理人员信息",
    		"法定代表人在其他企业任职信息","企业对外投资信息","股权出质历史信息",
    		"股权冻结历史信息","企业变更信息","行政处罚历史信息",
    		"分支机构信息","最终控股股东信息","企业年检信息",
    		"清算信息","动产质押信息","动产质押物信息",
    		};
	public static void main(String[] args) throws DocumentException, IOException {
		
		String path = BASE_DEST + String.valueOf(System.currentTimeMillis())+".pdf";
		new PdfReprot().createPdf(path);
		System.out.println("pdf生成！！！！");
	}
	
	public void createPdf(String path) throws DocumentException, IOException {
		//这里是需要的中英文字段对照
        setDataList();
		
		String jsonDataStr = getJsonStr();
		JSONObject json = new JSONObject(jsonDataStr);
		JSONObject jsonData = json.getJSONObject("data");
		String company = jsonData.getJSONArray("basicList").getJSONObject(0).getString("enterpriseName");
		
		
        Document doc = new Document(PageSize.A4);
        printSize(doc);
        PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(path));
        HeadEvent haEvent = new HeadEvent();
        writer.setPageEvent(haEvent);
        doc.open();
        //封面
        doc.add(new Paragraph("\n\n\n\n\n\n\n\n\n\n\n"));
        
        Paragraph firstTitle = new Paragraph("企业信用报告",firstCoverFont);
        firstTitle.setAlignment(Element.ALIGN_CENTER);
        firstTitle.setSpacingAfter(20);
        doc.add(firstTitle);
        
        Paragraph secondTitle = new Paragraph(company,secondCoverFont);
        secondTitle.setAlignment(Element.ALIGN_CENTER);
        doc.add(secondTitle);
        
        //目录
        /** 设置Margin是对下一页生效的。如果要对新的一页生效，是要在newPage之前设置。 */
//        doc.setMargins(150, 36, 36, 36);
        doc.newPage();
        doc.add(new Paragraph("\n\n\n"));
        Paragraph contentsP = new Paragraph("目录", firstCoverFont);
        contentsP.setIndentationLeft(100f);//左缩进
        contentsP.setSpacingAfter(70f);//段落后的留白
//        contentsP.setSpacingBefore(300f);//段落前的留白,如果的本页的第一个段落，该设置无效
        doc.add(contentsP);
        
        List contentsList = new List(true);
        contentsList.setIndentationLeft(100f);
        
//        contentsList.setPreSymbol("test");//列表符号(就是123)前的前缀
        for(String content : titleCnName) {
        	ListItem item = new ListItem(content,contentsTitleFont);
        	item.setLeading(contentsTitleFont.getSize(),1);
        	contentsList.add(item);
        }
        doc.add(contentsList);
        
        
        //用于存放字段每个条目下的字段中英文，中文用于表头，英文是json的key
        LinkedHashMap<String, String> columnMap;
        //columnMap的entry
        Set<Entry<String, String >> entrys;
        //用于每个条目的下标
        int titleCount = 0;
        //用于每个条目的标题
        Paragraph title;
        //用于存放每个条目的表格
        PdfPTable table;
        //用于存放每一个jsonaArr数据
        JSONArray jsonArr;
      //用于存放每一个jsonaObject数据
        JSONObject jsonOne;
        
        
        //一、企业照面信息
        
        doc.setMargins(40, 36, 70, 50);
        doc.newPage();
        titleCount++;
        jsonOne = jsonData.getJSONArray("basicList").getJSONObject(0);
        title = new Paragraph(titleCount + "、"+titleCnName[titleCount-1], firstTitleFont);
        doc.add(title);
        
        table = new PdfPTable(new float[] {40,100});
        table.setSpacingBefore(40);//表格前间距
        table.setSpacingAfter(100);//表格后间距
        
        table.setWidthPercentage(80);//表格宽占page比例
        table.setHorizontalAlignment(Element.ALIGN_LEFT);//表格对齐方式
        table.getDefaultCell().setVerticalAlignment(Element.ALIGN_TOP);//单元格中文字垂直对齐方式
        table.getDefaultCell().setBorderColor(BaseColor.WHITE);//单元格线条颜色
        table.getDefaultCell().setMinimumHeight(30);//单元格最小高度
        table.getDefaultCell().setExtraParagraphSpace(5);//段落文字与表格之间的距离,底部距离
        table.getDefaultCell().setLeading(15, 0);
        columnMap = dataList.get(titleCount-1);
        
       entrys = columnMap.entrySet();
        for(Entry<String, String> entry : entrys) {
        	String key = entry.getKey();
        	String value = entry.getValue();
        	String jsonValue = jsonOne.getString(key);
        	if(!"".contentEquals(jsonValue)) {
        		Chunk c = new Chunk(jsonValue,textFont);
//        		c.setLineHeight(20f);
        		Paragraph p = new Paragraph(c);
        		table.addCell(new Paragraph(value + ":", textFont));
            	table.addCell(p);
            	}
        	}
        	
        
        doc.add(table);
        
        //从第二个标题开始的后面所有标题的生成
        for(int i=1;i<dataList.size();i++) {
        	titleCount++;
            
            //标题
            title = new Paragraph(titleCount + "、"+titleCnName[titleCount-1], firstTitleFont);
            doc.add(title);
            
            columnMap = dataList.get(titleCount-1);
            entrys = columnMap.entrySet();
            
            table = new PdfPTable(entrys.size());
            table.setSpacingBefore(40);//表格前间距
            table.setSpacingAfter(100);//表格后间距
            table.setWidthPercentage(100);//表格宽占page比例%
            table.setHorizontalAlignment(Element.ALIGN_LEFT);//表格对齐方式
            table.setHeaderRows(1);//设置表头，在表格换页是会自动添加一行作为表头
            
            table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);//单元格垂直对齐方式
            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);//单元格水平对齐方式
            table.getDefaultCell().setExtraParagraphSpace(3);//段落文字与表格之间的距离,底部距离
            table.getDefaultCell().setGrayFill(0.9f);//设置单元格背景灰度值，0-1，数值越大，越偏向白色。
            table.getDefaultCell().setLeading(15, 0);
            for(String value : columnMap.values()) {
            	table.addCell(new Paragraph(value,tableHeadFont));
            }
            table.getDefaultCell().setGrayFill(GrayColor.GRAYWHITE.getGray());//设置单元格背景灰度值，0-1，数值越大，越偏向白色。
            jsonArr = jsonData.getJSONArray(titlejsonName[titleCount-1]);
            //判断jsonArr是否有数据，没有数据不添加表格
            if(jsonArr.length() == 0) {
            	Paragraph prompt = new Paragraph("该公司无该条目信息！！！",tableHeadFont);
            	prompt.setFirstLineIndent(30);//首行缩进
            	prompt.setSpacingAfter(40);
            	prompt.setSpacingBefore(40);
            	doc.add(prompt);
            }else{
            	for(int n=0;n<jsonArr.length();n++) {
                	jsonOne = jsonArr.getJSONObject(n);
                	for(String key : columnMap.keySet()) {
                		
                		String jsonValue = String.valueOf(jsonOne.get(key));
                		if("".equals(jsonValue)) {
                			table.addCell(new Paragraph("无数据",emptyFont));
                		}else {
                			table.addCell(new Paragraph(jsonValue,textFont));
                		}
                    	
                	}
                }
                doc.add(table);
            }
            
            
        }
        
        
        doc.close();
	}
	/**
	 * 定义页眉页脚事件，在一页完毕之后执行。
	 */
	class HeadEvent extends PdfPageEventHelper {
		
		
		/**
		 * 在一个页面开始写入前触发
		 */
		@Override
		public void onStartPage(PdfWriter writer, Document doc) {
			Font waterMarkFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20,Font.BOLD,BaseColor.LIGHT_GRAY);
			Phrase waterMarkPh = new Phrase("测试水印",waterMarkFont);
			float center = (doc.getPageSize().getLeft()+doc.getPageSize().getRight())/2;
			float top = doc.getPageSize().getTop()-36;
			float bottom = doc.getPageSize().getBottom()+36;
			
			float middle = doc.getPageSize().getTop()/2;
//			ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, waterMarkPh, center, middle, 45);
		       
			super.onStartPage(writer, doc);
		}
		/**
		 * 在一个页面写入完成后触发
		 */
		@Override
		public void onEndPage(PdfWriter writer, Document doc) {
			Font headFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 9,Font.NORMAL,BaseColor.BLACK);
			//添加标题文本
			StringBuffer underline = new StringBuffer();
			for(int i = 0;i<116;i++) {
				underline.append("_");
			}
			Phrase contentPh = new Phrase("国家技术转移东部中心",headFont);
			Phrase underlinePh = new Phrase(underline.toString(),headFont);
			Phrase pageNumberPh = new Phrase(String.valueOf(doc.getPageNumber()),headFont);
			float center = doc.getPageSize().getRight()/2;//页面的水平中点
			float top = doc.getPageSize().getTop()-36;
			float bottom = doc.getPageSize().getBottom()+26;
			
			/** 参数xy是指文本显示的页面上的哪个店。alignment指文本在坐标点的对齐方式 */
	        ColumnText.showTextAligned(writer.getDirectContent(),Element.ALIGN_CENTER,contentPh,center,top,0); //页眉
	        ColumnText.showTextAligned(writer.getDirectContent(),Element.ALIGN_CENTER,underlinePh,center,top-3,0); //页眉
	        ColumnText.showTextAligned(writer.getDirectContent(),Element.ALIGN_CENTER,pageNumberPh,center,bottom,0); //页码
		}
		
	}
	
	/**
	 * 读取样例文件
	 * @return
	 * @throws IOException
	 */
	public String getJsonStr() throws IOException {
		String path = "src/main/resources/file/pdf/qixinbao.json";
		File file = new File(path);
		FileInputStream fis = new FileInputStream(file);
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);
		String line;
		StringBuffer dataStr = new StringBuffer();
		while((line = br.readLine()) != null) {
			dataStr.append(line);
		}
		br.close();
		
		return dataStr.toString();
		
	}
	
	public void setDataList() {
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
      //1.企业照面信息
        map = new LinkedHashMap<String, String>();
        map.put("enterpriseName", "企业名称");
        map.put("frName", "法人姓名");
        map.put("regNo", "工商注册号");
        map.put("regCap", "注册资金(万元)");
        map.put("regCapCur", "注册币种");
        map.put("esDate", "开业日期");
        map.put("openFrom", "经营期限自");
        map.put("openTo", "经营期限至");
        map.put("enterpriseType", "企业(机构)类型");
        map.put("enterpriseStatus", "经营状态");
        map.put("cancelDate", "注销日期");
        map.put("address", "注册地址");
        map.put("abuItem", "许可经营项目");
        map.put("cbuItem", "一般经营项目");
        map.put("operateScope", "经营(业务)范围");
        map.put("operateScopeAndForm", "经营(业务)范围及方式");
        map.put("regOrg", "登记机关");
        map.put("ancheYear", "最后年检年度");
        map.put("ancheDate", "最后年检日期");
        map.put("industryName", "国民经济行业名称");
        map.put("recCap", "实收资本");
        map.put("oriRegNo", "原注册号");
        map.put("empnum", "员工人数");
        map.put("entnameeng", "企业英文名称");
        map.put("orgcodes", "组织机构代码");
        map.put("creditcode", "统一社会信用代码");
        map.put("changedate", "变更日期");
        map.put("regorgprovince", "所在省份");
        map.put("regorgcode", "注册地址行政区编号");
        map.put("domdistrict", "住所所在行政区划");
        map.put("zsopscope", "经营业务范围");
        dataList.add(map);
      //2.企业股东及出资信息
        map = new LinkedHashMap<String, String>();
        map.put("shareholderName", "股东名称");
        map.put("subConam", "认缴出资额（万元）");
        map.put("country", "国别");
        map.put("conform", "出资方式");
        map.put("invtype", "股东类型");
        
        dataList.add(map);
       //3.企业主要管理人员信息(personList)数据字段
        map = new LinkedHashMap<String, String>();
        map.put("name", "姓名");
        map.put("position", "职务");
        map.put("sex", "性别");
        map.put("personamount", "人员总数量");
        dataList.add(map);
      //4. 法定代表人在其他企业任职信息(frPositionList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("frName", "法人姓名");
        map.put("entName", "企业（机构）名称");
        map.put("regNo", "注册号");
        map.put("entType", "企业（机构）类型");
        map.put("regCap", "注册资本");
        map.put("entStatus", "企业状态");
        map.put("position", "职务");
        dataList.add(map);
      //5. 企业对外投资信息(entinvItemList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("entName", "企业名称");
        map.put("regNo", "注册号");
        map.put("entType", "企业 (机构 )类型");
        map.put("regCap", "注册资本(万元 )");
        map.put("entStatus", "企业状态");
        map.put("subConam", "认缴出资额 (万元)");
        map.put("name", "法定代表人姓名");
        map.put("conform", "出资方式");
        dataList.add(map);
        //6. 股权出质历史信息(sharesImpawnList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("regNo", "登记编号");
        map.put("cPerson", "出质人");
        map.put("cCerNo", "出质人证件/证件号");
        map.put("amount", "出质股权数额");
        map.put("person", "质权人姓名");
        map.put("cerNo", "质权人证件/证件号");
        map.put("regDate", "质权出质设立登记日期");
        map.put("status", "状态");
        map.put("date", "公示日期");
        dataList.add(map);
        //7. 股权冻结历史信息(sharesFrostList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("froDocno", "冻结文号");
        map.put("froAuth", "冻结机关");
        map.put("froFrom", "冻结起始日期");
        map.put("froTo", "冻结截至日期");
        map.put("froAm", "冻结金额");
        map.put("thawAuth", "解冻机关");
        map.put("thawDocno", "解冻文号");
        map.put("thawDate", "解冻日期");
        map.put("thawComment", "解冻说明");
        dataList.add(map);
      //8. 企业变更信息(alterList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("altDate", "变更日期");
        map.put("altItem", "变更事项");
        map.put("altBe", "变更前内容");
        map.put("altAf", "变更后内容");
        dataList.add(map);
      //9. 行政处罚历史信息(caseInfoList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("caseReason", "案由");
        map.put("penAuth", "处罚机关");
        map.put("pendecissDate", "处罚决定书签发日期");
        map.put("penBasis", "处罚依据");
        map.put("penResult", "案件结果");
        map.put("penAm", "处罚金额");
        map.put("penExest", "处罚执行情况");
        map.put("caseType", "案件类型");
        map.put("caseTime", "案发时间");
        map.put("caseResult", "处罚结果");
        dataList.add(map);
      //10. 分支机构信息(filiationList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("brName", "分支机构名称");
        map.put("brRegno", "分支机构企业注册号");
        map.put("brPrincipal", "分支机构负责人");
        map.put("cbuItem", "一般经营项目");
        map.put("brAddr", "分支机构地址");
        dataList.add(map);
      //11. 最终控股股东信息(finalshareholdList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("finalentname", "最终控股股东名称");
        map.put("finalinvtype", "股东类型");
        map.put("finalsubconam", "认缴出资额(万元)");
        map.put("finalacconam", "实缴出资额(万元)");
        map.put("finalconam", "出资额");
        map.put("finalconform", "出资方式");
        map.put("finalratio", "出资比例");
        map.put("finalstatus", "审核状态");
        dataList.add(map);
      //12. 企业年检信息(dealinInfoList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("ancheyear", "年检年度");
        map.put("assgro", "资产总额");
        map.put("progro", "利润总额");
        map.put("deficit", "亏损额");
        map.put("vendinc", "销售(营业)收入");
        map.put("netinc", "净利润");
        map.put("busst", "运营状况");
        map.put("liagro", "负债总额");
        map.put("servinc", "服务营业收入");
        map.put("ratgro", "纳税总额");
        dataList.add(map);
      //13. 清算信息(liquidationList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("ligentity", "清算责任人");
        map.put("ligprincipal", "清算负责人");
        map.put("liqMen", "清算组成员");
        map.put("liGst", "清算完结情况");
        map.put("ligEndDate", "清算完结日期");
        map.put("debtTranee", "债务承接人");
        map.put("claimTranee", "债权承接人");
        dataList.add(map);
      //14. 动产质押信息(morDetaiList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("morregId", "抵押ID");
        map.put("mortgaGor", "抵押人");
        map.put("more", "抵押权人");
        map.put("morType", "状态标识");
        map.put("appreGrea", "申请抵押原因");
        map.put("priclasecKind", "被担保主债权种类");
        map.put("priclaseCam", "被担保主债权数额(万元)");
        map.put("pefperFrom", "履约起始日期");
        map.put("pefperTo", "履约截止日期");
        map.put("canDate", "注销日期");
        dataList.add(map);
      //15. 动产质押物信息(morguaInfoList)数据字段：
        map = new LinkedHashMap<String, String>();
        map.put("morreg_Id", "抵押ID");
        map.put("guaName", "抵押物名称");
        map.put("quan", "数量");
        map.put("value", "价值(万元)");
        dataList.add(map);
	}
	
	public void printSize(Document doc) {
		System.out.println("margin尺寸");
		//页面边距
        System.out.println("top:"+doc.topMargin());//上边距
        System.out.println("bottom:"+doc.bottomMargin());//下边距
        System.out.println("left:"+doc.leftMargin());//左边距
        System.out.println("right:"+doc.rightMargin());//右边距
        
        System.out.println("page正文尺寸");
        //去除也边距后对角值
        System.out.println("top:"+doc.top());//右上角y轴坐标
        System.out.println("bottom:"+doc.bottom());//左下角y轴坐标
        System.out.println("left:"+doc.left());//左下角x轴坐标
        System.out.println("right:"+doc.right());//右上角x轴坐标
        
        
        System.out.println("页面尺寸");
        //当前页面的对角坐标值，当前是A4纸
        System.out.println("top:"+doc.getPageSize().getTop());//右上角y轴坐标
        System.out.println("bottom:"+doc.getPageSize().getBottom());//左下角y轴坐标
        System.out.println("left:"+doc.getPageSize().getLeft());//左下角x轴坐标
        System.out.println("right:"+doc.getPageSize().getRight());//右上角x轴坐标
        System.out.println();
	}
}
